funkcia swap

Otázka od: Peter Surovy

19. 9. 2002 13:53

Ahoj
mam DelphiV Ent a tam je funkcia
swap ktora prevadza high-order bytes value
na low-order-bytes value.
ale funguje len pre 16 bitove hodnoty
ja by som potreboval pre 32 bitove konkr
longword.
Existuje to niekde alebo si to treba napisat?
Dik
Peter

Odpovedá: Jiří Semler

19. 9. 2002 17:17

> swap ktora prevadza high-order bytes value
> na low-order-bytes value.
> ale funguje len pre 16 bitove hodnoty
> ja by som potreboval pre 32 bitove konkr
> longword.

Asi nejak takle:

function Swap32(x:longword):longword;
var y:array [1..4] of byte absolute x;
    z:byte;
begin
  z:=y[1]; y[1]:=y[4]; y[4]:=z;
  z:=y[3]; y[3]:=y[2]; y[2]:=z;
  result:=x;
end;

Odpovedá: Petr Fejfar

19. 9. 2002 16:50

From: "Jiří Semler" <jsemler@stbk.mcs.cz>

> function Swap32(x:longword):longword;
> var y:array [1..4] of byte absolute x;
> z:byte;
> begin
> z:=y[1]; y[1]:=y[4]; y[4]:=z;
> z:=y[3]; y[3]:=y[2]; y[2]:=z;
> result:=x;
> end;

Pokud tomu dobre rozumim, tak Ti jde o otoceni Endianu.
To by slo treba takhle:

function ReverseEndian(aValue:dword): dword; assembler;
asm
    xchg al,ah
    rol eax,16
    xchg al,ah
end;


HTH, pf

Odpovedá: Peter Surovy

19. 9. 2002 18:24

Ahoj

----- Original Message -----
From: "Petr Fejfar" <development@callnet.cz>
Sent: Thursday, September 19, 2002 4:49 PM

> Pokud tomu dobre rozumim, tak Ti jde o otoceni Endianu.
-- presne

> To by slo treba takhle:
--no ja som to medzi casom spravil
podobne ako radil:

----- Original Message -----
From: "Jiří Semler" <jsemler@stbk.mcs.cz>
Sent: Thursday, September 19, 2002 3:43 PM

> function Swap32(x:longword):longword;
> var y:array [1..4] of byte absolute x;
> z:byte;

----ale toto Tvoje sa mi zda tiez zaujimave
hlavne preto ze z toho nerozumiem nic
okrem 'function' a 'end' jake to ma vyhody?

> function ReverseEndian(aValue:dword): dword; assembler;
> asm
> xchg al,ah
> rol eax,16
> xchg al,ah
> end;
Peter

Odpovedá: Petr Fejfar

19. 9. 2002 19:23

From: "Peter Surovy" <psurovy@uevora.pt>

> ----ale toto Tvoje sa mi zda tiez zaujimave
> hlavne preto ze z toho nerozumiem nic
> okrem 'function' a 'end' jake to ma vyhody?
>
> > xchg al,ah
> > rol eax,16
> > xchg al,ah


Vyhoda bude v jednoduchosti a rychlosti, protoze pokud jsem ten assembler
moc nezapomel, tak to asi implementovat rychleji nejde.
A endiany se vetsinou prohazuji pri komunikaci
Unix <-> WinTel, takze tam o rychlost zpravidla jde.

Pouziva to registrovou volaci konvenci, takze vstup je v registru EAX,
vysledek taky.

Instrukce XCHG prohazuji byty ve spodnim slove, ROL prohodi slova rotaci
doleva o 16 bitu. Tot vse.

HTH, pf